在线地图显示 (在线矢量地图)Sample (在线瓦片地图)Sample(天地图)Sample (百度地图)Sample (高德地图)Sample (Google地图)Sample (OSM地图)Sample

最后更新时间:2020年12月4日

在线地图显示方法

MapGIS移动端支持的在线地图数据类型包括:MapGIS的在线矢量、瓦片地图服务,基于OGC标准的地图服务(WMS、WMTS),以及第三方在线地图服务(天地图、Google地图、OSM地图、百度地图、高德地图、Bing地图等)。

在线地图数据来源众多,但显示方法原理相同,方法类似,在线地图的加载方法可以归纳为以下的两种,所有在线地图都可以通过这两种方式加载显示。

方法 接口 地图类型 使用场景
服务图层方式 setMapAsync 所有在线地图 不需配置地图文档
地图文档方式 loadFromFileAsync / loadFromDocumentAsync 所有在线地图 需要配置地图文档

一、【推荐】服务图层方式

通过地图服务URL地址构造ImageLayer服务图层,从而构建map,然后调用MapView类的setMap / setMapAsync方法加载。此方法经常采用于图层数量少的情况下,简单便捷,不需配置地图文档。接下来以MapGIS IGServer在线矢量地图服务为例展示实现过程。

0203MapView加载地图接口2.png 0208ImageLayer类接口.png 0209MapServer类接口.png

import com.zondy.mapgis.geometry.Rect;
import com.zondy.mapgis.map.Document;
import com.zondy.mapgis.map.ImageLayer;
import com.zondy.mapgis.map.Map;
import com.zondy.mapgis.map.MapServer;
import com.zondy.mapgis.map.view.mapview.MapView;
import com.zondy.mapgis.environment.Environment.AuthorizeCallback;

//获取移动端设备sd卡的根目录
public final static String rootPath = Environment.getExternalStorageDirectory().getPath();
public final static String systemPath = Environment.getExternalStorageDirectory().getPath() + "/MapGISSample/";

//环境初始化,必须在使用SDK各组件之前调用,会自动建立根目录结构
com.zondy.mapgis.environment.Environment.initialize(systemPath, this);
//授权请求
com.zondy.mapgis.environment.Environment.requestAuthorization(this, new AuthorizeCallback() {
    @Override
    //授权完成后回调
    public void onComplete() {
        System.out.println("授权完成");

        //获取地图容器
        mapView = (MapView) findViewById(R.id.mapview_id);

        //在线地图服务url
        String onlineMapURLPath = "http://develop.smaryun.com:6163/igs/rest/mrms/docs/WorldJWVector";

        //获取地图服务对象,矢量的为MAPSERVER_TYPE_IGSERVER_VECTOR
        MapServer mapServer = ImageLayer.createMapServer(MapServer.MAPSERVER_TYPE_IGSERVER_VECTOR);
        //设置地图类型
        mapServer.setName("docs");
        //设置服务在线url地址,如"http://develop.smaryun.com:6163/igs/rest/mrms/docs/WorldJWVector"
        mapServer.setURL(onlineMapURLPath);
        //服务图层
        ImageLayer mServerLayer = new ImageLayer();
        mServerLayer.setMapServer(mapServer);

        if (mMap == null) {
            mMap = new Map();
        }
        //将服务图层添加到地图对象中
        mMap.append(mServerLayer);
        //将地图对象显示在地图容器中
        mapView.setMapAsync(mMap, new MapViewFinishCallback() {
            @Override
            public void onDidFinish(boolean arg0) {
                if (arg0) {
                    //缩放地图到指定范围
                    Rect rect = new Rect(111.858046,21.405052,128.108205,47.044193);
                    mapView.zoomToRange(rect, false);

                    Toast.makeText(ShowServerDocMap_Activity.this, "在线矢量地图加载成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(ShowServerDocMap_Activity.this, "在线矢量地图加载失败,请确保网络已连接", Toast.LENGTH_SHORT).show();
                }
            }
        });
     }
   }

所有在线地图加载使用的方法都一样,区别只是在构建MapServer地图服务对象时选择的服务类型的不同。MapGIS Mobile提供诸多类型的地图服务,例如MapGIS地图服务、OGC服务、天地图、Google地图服务、百度地图、高德地图等等,其地图服务类型对应的接口由com.zondy.mapgis.map.MapServer;类提供,关键的地图服务类型如下表所示:

数据来源 数据类型 地图服务类型
在线 IGServer矢量地图服务 MAPSERVER_TYPE_IGSERVER_VECTOR
IGServer瓦片地图服务 MAPSERVER_TYPE_IGSERVER_TILE
WMS服务 MAPSERVER_TYPE_OGC_WMS
WMTS服务 MAPSERVER_TYPE_OGC_WMTS
天地图服务 MAPSERVER_TYPE_TIANDITU
谷歌地图服务 MAPSERVER_TYPE_GOOGLE_MAP
百度地图服务 MAPSERVER_TYPE_BAIDU_MAP
OSM地图服务 MAPSERVER_TYPE_OPENSTREET_STANDARD
Bing地图服务 MAPSERVER_TYPE_BING_MAP
离线 瓦片地图 MAPSERVER_TYPE_TDF

0300类地图服务类型枚举.png

为方便用户使用公共地图服务,除了MapGIS IGServer地图服务、天地图系列的服务、OGC标准的WMS / WMTS服务,其他所有地图服务在接口内部已经设置好服务地址,不需用户调用setUrl方法自己设置。

重点说明:根据天地图的要求,使用天地图提供的地图服务,需要申请key,对此MapGIS Mobile对接了此要求,调用方法稍有不同,区别在于构建MapServer时还需设置认证信息,如下所示:



        //获取服务地图对象,其中天地图的默认地图服务类型为MapServer.MAPSERVER_TYPE_TIANDITU
        MapServer mapServer = ImageLayer.createMapServer(MapServer.MAPSERVER_TYPE_TIANDITU);
        //设置地图类型
        mapServer.setName("Tianditu_vec");
        //设置认证信息
        //mapServer.setAuthentication("tk", "用户申请的key");
        mapServer.setAuthentication("tk", "ad6c6a0bd9b1fa421dfd77ba49e70ecf");
        //设置在线url地址,如"http://t0.tianditu.com/vec_c/wmts"
        mapServer.setURL(FilePath.TIANDITU_VECTOR_PATH);

        mServerLayer = new ImageLayer();
        mServerLayer.setMapServer(mapServer);

        //将服务图层添加到地图对象中
        mMap.append(mServerLayer);

说明:setAuthentication方法中的第二个参数即为key值,需要用户根据自己的应用申请,申请地址为天地图官网

二、地图文档方式

移动端加载在线地图可以通过地图文档方式,前提是需要在MapGIS桌面工具中将在线地图组织为地图文档。

0203MapView加载地图接口1.png

1、loadFromFileAsync方法

       //异步方法加载地图:传入mapx地图文档在移动设备存储中的完整路径
       mapView.loadFromFileAsync(MainActivity.rootPath+"/MapGISSample/Map/MapShow/OnlineWorldJWVector.mapx");

        //设置地图加载监听
        mapView.setMapLoadListener(new MapViewMapLoadListener() {
            @Override
            public void mapViewWillStartLoadingMap(MapView arg0, String arg1) {
                //开始加载地图
                Toast.makeText(ShowServerDocMap_Activity.this, "开始加载地图", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void mapViewDidFinishLoadingMap(MapView arg0, String arg1) {
                //地图加载完成
                Rect rect = new Rect(-180.001620301582, -90.0045966746376, 180, 110.303611404827);
                mapView.zoomToRange(rect, true);

                Toast.makeText(ShowServerDocMap_Activity.this, "在线矢量地图加载完成", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void mapViewDidFailLoadingMap(MapView arg0, String arg1) {
                //地图加载失败
                Toast.makeText(ShowServerDocMap_Activity.this, "在线矢量地图加载失败,请确保网络已连接", Toast.LENGTH_SHORT).show();
            }
        });



代码说明:loadFromFileAsync接口中传入的是在线地图文档mapx格式文件的完整路径,mapx地图文档需要用户自己在MapGIS桌面工具中进行组织配置。

2、loadFromDocumentAsync方法


        //以loadfromdocumentaync方式加载在线矢量地图文档,需要在子线程中执行document.open方法,请求在线数据
        Runnable run = new Runnable() {
            @Override
            public void run() {
                //使用此种方法,document对象必须设置为成员变量,否则的话会因为java内存回收机制容易导致程序崩溃
                if (doc == null) {
                    doc = new Document();
                }

                //打开地图文档
                doc.open(MainActivity.rootPath+"/MapGISSample/Map/MapShow/OnlineWorldJWVector.mapx");

                //发送消息
                Message msg = new Message();
                msg.what = 1;
                mHandler.sendMessage(msg);
            }
        };
        //开启子线程
        new Thread(run).start();

        //handler处理消息
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);

                //加载地图,loadfromdocumentasync,加载地图文档对应索引的地图
                mapView.loadFromDocumentAsync(doc, 0, new MapViewFinishCallback() {
                    @Override
                    public void onDidFinish(boolean arg0) {
                        if (arg0 == true) { //地图加载完成
                            Rect rect = new Rect(-180.001620301582, -90.0045966746376, 180, 110.303611404827);
                            mapView.zoomToRange(rect, true);

                            Toast.makeText(ShowServerDocMap_Activity.this, "在线矢量地图加载完成", Toast.LENGTH_SHORT).show();
                        } else {//地图加载失败
                            Toast.makeText(ShowServerDocMap_Activity.this, "在线矢量地图加载失败,请确保网络已连接", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }
        };

显示效果如下所示:

在线矢量地图显示效果.jpg 0302在线瓦片地图显示效果.jpg 0303在线WMS地图显示效果.jpg